// 输入两个链表，找出它们的第一个公共结点。（注意因为传入数据是链表，所以错误测试数据的提示是用其他方式显示的，保证传入数据是正确的）
// 解题思路： 首先我们要知道什么是公共结点，两个链表从某一节点开始，他们的 next 都指向同一个结点。
// 但由于是单向链表的结点，`每个结点只有一个 next，因此从第一个公共结点开始，之后他们的所有结点都是重合的，不可能再出现分叉。`

// 双指针法。创建两个指针 p1 和 p2,分别指向两个链表的头结点，然后依次往后遍历。
// 如果某个指针到达末尾，则将该指针指向另一个链表的头结点；如果两个指针所指的结点相同，则循环结束，返回当前指针指向的结点。
// 比如两个链表分别为：1->3->4->5->6 和 2->7->8->9->5->6。
// `短链表的指针 p1 会先到达尾部，然后重新指向长链表头部，当长链表的指针 p2 到达尾部时，
// 重新指向短链表头部，此时 p1 在长链表中已经多走了 k 步(k 为两个链表的长度差值)，p1 和 p2 位于同一起跑线，
// 往后遍历找到相同结点即可。其实该方法主要就是用链表循环的方式替代了长链表指针先走 k 步这一步骤。`

/*function ListNode(x){
    this.val = x;
    this.next = null;
}*/

function FindFirstCommonNode(pHead1, pHead2) {
  let p1 = pHead1;
  let p2 = pHead2;
  while (p1 !== p2) {
    // 如果一个短的链表率先遍历结束就转去指向长链表
    // 长的链表结束了就转指向短的
    // p1 = p1 == null ? pHead2 : p1.next;
    // p2 = p2 == null ? pHead1 : p2.next;
    if (p1 == null) {
      p1 = pHead2;
    } else {
      p1 = p1.next;
    }

    if (p2 == null) {
      p2 = pHead1;
    } else {
      p2 = p2.next;
    }
  }
  return p1;
}
